#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define MAXSIZE 100 //稀疏矩阵压缩存储初始化大小

void printf_symmetryMatrix(double *s, int n)
{//n为矩阵的维数,打印n维对称矩阵
	int k =0;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0;j < n; j++)
		{
			if (i >= j)
				k = i*(i+1)/2 + j;
			else
				k = j*(j+1)/2 + i;
				//j大于i,即i和j的下标互换了位置A23 即输出A32的值

			printf("%d\t", s[k]);
		}
		printf("\n");
	}
}

void symmetryMatrix(int n)
{//一维数组存储n维对称矩阵
	int len = n*(n + 1)/2;
	double s[len];

	printf("需要输入%d个数字\n",len);

	for (int i = 0;i < len; i++)
	{
		scanf("%d",&s[i]);

	}

	printf("\n");
	printf_symmetryMatrix(s,n);
}

void printf_triangleMatrix(double *s, int n, int L)
{//L为选择上或者下三角,1为上2为下，打印n为三角矩阵
	if (L < 1 || L > 2)
		exit(0);

	int k =0;

	int len = n*(n+1)/2 + 1;

	if (L == 1)
	{
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				if (i <= j)
					k = i*(2*n - i + 1)/2 +j - i + 1;
				if (i > j)
					k = len;

				printf("%d\t", s[k - 1]);
			}

			printf("\n");
		}
		
	}
	else if (L == 2)
	{
		for (int i = 0; i < n; i++)
		{
			for (int j = 0;j < n; j++)
			{
				if (i >= j)
					k = i*(i+1)/2 + j;
				else
					k = len - 1;
					//j大于i,输入常数

				printf("%d\t", s[k]);
			}

			printf("\n");

		}

	}

}

void triangleMatrix(int n, int L)
{//一维数组存储n维三角矩阵,L为选择上或者下三角,1为上2为下
	int len = n*(n+1)/2 + 1;
	//加的1为另一块相等三角区域的常数，只用一个空间存在数组末端
	double s[len];

	printf("先连续输入三角区域%d个数\n",len-1);

	for (int i = 0;i < len - 1; i++)
	{
			scanf("%d",&s[i]);
	}

	printf("输入另一块三角区域的常数：");
	scanf("%d",&s[len - 1]);

	printf_triangleMatrix(s,n,L);


}

void oppositeMatrix(int n,int L)
{//对角矩阵，其余的为零，L为中间带状的条数
 //一维数组存储带状的矩阵


}


/*
稀疏矩阵：一个m*n矩阵，当矩阵中0的个数t
		当 t/(m*n) < 0.05 时，该矩阵为稀疏矩阵
*/
typedef struct node_sparsematrix
{//稀疏矩阵的一个元素
	int i;//行
	int j;//列
	int e;//对应的值s

}node_SparseMatrix;

typedef struct sparsematrix
{
	node_sparsematrix data[MAXSIZE];
	int m,n,len;
}sparseMatrix;

int CreateMatrix(sparseMatrix *M)
{//创建一个稀疏矩阵


}

int main(void)
{
	int n;
	int i;
	printf("输入矩阵的秩:");
	scanf("%d",&n);
	printf("选择是上三角还是下三角:\n");
	scanf("%d",&i);
	triangleMatrix(n,i);
}